package io.lvdaxian.handwriting.lock;

/**
 * 针对 字符串进行加锁
 *
 * @author lihh
 */
public class StringLock02 {
  public void save(String school) {
    System.out.println(school);
    try {
      Thread.sleep(500);
    } catch (InterruptedException e) {
      throw new RuntimeException(e);
    }
  }
  
  public String saving(String school) {
    // 在Java中，字符串的intern()方法是一个用于字符串池（String Pool）的方法。当调用intern()方法时，如果字符串池中已经包含一个等于此String对象的字符串（使用equals方法进行比较），则返回池中的字符串。否则，将此String对象添加到字符串池中，并返回此String对象的引用。
    //使用intern()方法可以确保相同内容的字符串在内存中只有一份，节省内存空间。这对于频繁使用相同字符串的情况非常有用，因为可以减少内存占用。
    synchronized (school.intern()) {
      System.out.println(school + "学生交卷");
      save(school);
      System.out.println(school + "学生交卷完成");
      
      return "ok";
    }
  }
  
  public static void main(String[] args) throws InterruptedException {
    StringLock02 stringLock01 = new StringLock02();
    
    Thread t1 = new Thread(() -> stringLock01.saving(new String("北大")));
    Thread t2 = new Thread(() -> stringLock01.saving(new String("清华")));
    Thread t3 = new Thread(() -> stringLock01.saving(new String("清华")));
    
    t1.start();
    t2.start();
    t3.start();
    
    t1.join();
    t2.join();
    t3.join();
  }
}
